[图形学]基础知识-着色器
基础知识-着色器
基本概念
Shader
Shader (着色器):运行在 GPU 的小程序,自定义显卡渲染画面的算法,使画面达到我们想要的效果。本质就是一段代码(主流的有 基于 OpenGL 的 GLSL、基于 DirectX 的 HLSL 等),这段代码的作用是阐述如何绘制每一个顶点的颜色以及最终每一个像素点的颜色。
顶点着色器 (Vertex Shader):
进行顶点相关的一系列操作。通常用来把顶点从模型空间变换到平面空间。
可以用于通过 矩阵变换位置、计算照明公式来 生成逐顶点颜色 以及 生成或变换纹理坐标 等基于顶点的操作。
几何着色器 (Geometry Shader):
以完整的图元作为输入数据,可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状,创建或销毁几何图元。
经过几何着色器处理后,得到的是一系列位于齐次裁剪空间的顶点所组成的图元,这些顶点会在后面的裁剪、透视除法和光栅化阶段得到进一步处理。
片元着色器 (Fragment Shader):
对片元进行纹理采样、颜色汇总等处理,计算一个像素的最终颜色。
GLSL
基本要求
Shader 的开头要声明版本,接着是输入和输出变量、uniform
和 main
函数。
输入和输出
:使用关键字 in
、out
进行数据交流传递;顶点着色器应该为输入提供一个 layout
标识;片元着色器需要输出一个 vec4
的颜色。
uniform
:一种从 CPU中的应用 向 GPU 中的Shader 发送数据的方式;它是全局的;会一直保存数据,直到被重置或更新。我们也可以不采用 uniform
,而选择给 顶点属性设置 添加数据来设置颜色。
main
:Shader 的入口,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。
顶点属性设置
将一个顶点属性设置为有:X、Y、Z、R、G、B 等数据;
1 | float vertices[] = { |
设置一下 顶点着色器 的输入:
1 | layout (location = 0) in vec3 aPos; // 位置变量的属性位置值为 0 |
重新配置顶点属性指针,根据上图与设置可以发现:
- 位置属性
location = 0
,两个顶点属性间隔为6 * sizeof(float)
,起始偏移量为0
; - 颜色属性
location = 1
,两个顶点属性间隔为6 * sizeof(float)
,起始偏移量为3 * sizeof(float)
;
1 | // 位置属性 |
完整代码
Shader.h (封装 Shader 的一些操作)
1 |
|
Shader01.vs
1 |
|
Shader01.fs
1 |
|
main.cpp
1 |
|